迷宫问题
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10818 | Accepted: 6458 |
Description
定义一个二维数组:
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
Sample Output
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
很简单的搜索题,DFS BFS都可以。学习搜索~DFS实现,用栈保存路径,使用容器实现栈的自底输出
题目链接:POJ 3984 迷宫问题
重新编辑:后来写了一个用BFS实现的,文章地址:POJ3984 迷宫问题 BFS
ACM搜索课件下载 ACM搜索PPT (天津大学acm课件,转发请注明出处。)
#include<iostream>
#include<stack>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
struct node
{
int a,b;
};
int maze[7][7];
bool vis[7][7];
stack<node>passby;
void init()
{
memset(vis,0,sizeof(vis)); //布尔型vis初始化0,记录是否访问过
for(int i=0;i<7;i++) //迷宫四周围墙设为1
{
maze[i][0]=1;
maze[0][i]=1;
maze[6][i]=1;
maze[i][6]=1;
}
}
void dfs(int x,int y)
{
if(!vis[x][y]) // 如果没有访问过
{
node cur; //cur为当前位置
cur.a=x;
cur.b=y;
vis[x][y]=1; //当前位置cur设为已访问
passby.push(cur); //入栈
}
if(x==5&&y==5) //如果到迷宫出口 返回
return ;
if(!vis[x+1][y]&&!maze[x+1][y]) //如果右面的一个没有访问过而且不是墙,就向右走
dfs(x+1,y);
else if(!vis[x][y+1]&&!maze[x][y+1]) //如果下面的一个没有访问过且不是墙,向下走
dfs(x,y+1);
else //右面和下面都有墙
{
passby.pop(); //pop,后退一步
node cur=passby.top(); //将当前位置cur置为栈顶元素,即上一步位置
dfs(cur.a,cur.b); //对当前cur位置继续进行如上dfs操作
}
}
int main()
{
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
scanf("%d",&maze[i][j]); //建立迷宫内部
init(); //初始化
dfs(1,1); //从头开始走
vector<node>v; //node容器,用于输出。
while(passby.empty()==false) //如果栈非空
{ /*用容器实现栈的自底输出*/
v.push_back(passby.top()); //在容器尾部加入栈顶元素
passby.pop(); //pop栈顶元素
} /*这样就把栈内所有元素放入容器中*/
for(int i=v.size()-1;i>=0;i--)
{
printf("(%d, %d)\n",v[i].a-1,v[i].b-1);
}
return 0;
}